/*
 * @Author: Sorzn
 * @Date: 2019-12-12 14:33:50
 * @LastEditTime: 2019-12-13 15:47:59
 * @Description: M5Stack project
 * @FilePath: /M5Stack/examples/Modules/BaseX/BaseX.h
 */

#ifndef __BASE_X_H__
#define __BASE_X_H__

#include "Arduino.h"

#define BASE_X_ADDR (0x22)

#define BASE_X_SERVO_ANGLE_ADDR (0x00)
#define BASE_X_SERVO_PULSE_ADDR (0x10)
#define BASE_X_PWM_DUTY_ADDR    (0x20)
#define BASE_X_ENCODER_ADDR     (0x30)
#define BASE_X_SPEED_ADDR       (0x40)

/*
   |  0  |       1     |      2     |     3      |    4, 5, 6, 7  |          8
   |     9    |    10   |    11   |     12      | | mod |  position-p |
   position-i | position-d | position-point | position-max-speed |  speed-p |
   speed-i | speed-d | speed-point |
*/
#define BASE_X_CONFIG_ADDR (0x50)

#define NORMAL_MODE   (0x00)
#define POSITION_MODE (0x01)
#define SPEED_MODE    (0x02)

class BASE_X {
   public:
    void SetMode(uint8_t pos, uint8_t mode);

    int32_t GetEncoderValue(uint8_t pos);
    void SetEncoderValue(uint8_t pos, int32_t encode);

    void SetMotorSpeed(uint8_t pos, int8_t duty);
    int8_t GetMotorSpeed(uint8_t pos);

    int8_t GetMotorSpeed20MS(uint8_t pos);

    void SetPositionPID(uint8_t pos, uint8_t kp, uint8_t ki, uint8_t kd);
    void SetPositionPoint(uint8_t pos, int32_t position_point);
    void SetPositionPIDMaxSpeed(uint8_t pos, uint8_t max_pwm);

    void SetSpeedPID(uint8_t pos, uint8_t kp, uint8_t ki, uint8_t kd);
    void SetSpeedPoint(uint8_t pos, int8_t speed_point);

    void SetServoAngle(uint8_t pos, uint8_t angle);
    void SetServoPulseWidth(uint8_t pos, uint16_t width);

   private:
    uint8_t CheckPos(uint8_t pos);
};

#endif